#ifndef __UASART_H
#define __UASART_H

#include "user_global.h"

typedef enum
{
  HAL_OK       = 0x00U,
  HAL_ERROR    = 0x01U,
  HAL_BUSY     = 0x02U,
  HAL_TIMEOUT  = 0x03U
} HAL_StatusTypeDef;
#define UART_HandleTypeDef uint32_t

#define UART0_BUF_SIZE      128     // 一定是2^n
#define UART0_BUF_MASK      (UART0_BUF_SIZE-1)

extern uchar  REN0;                              // 串口0接收使能
extern uchar  uart0_dr;                         // uart1要发送长度
extern uchar  uart0_len;                        // uart0已接收/或要发送长度
extern uchar  uart0_buf[UART0_BUF_SIZE];        // uart0发送/接收缓冲区
extern ushort  uart0_timestamp;                 // 最后接收时间
extern uchar *uart0_tx_ptr;                     // 发送指针
extern bit uart0_rx_pending;                    // uart0正在接收标志
extern bit uart0_tx_pending;                    // uart0正在发送标志 
extern bit uart0_delay_process;            // uart0指令延时处理

#define UART2_BUF_SIZE      UART0_BUF_SIZE      // 一定是2^n
#define UART2_BUF_MASK      (UART0_BUF_SIZE-1)

extern uchar uart2_tx_len;                      // uart1要发送长度
extern uchar uart2_tx_left;                     // uart1发送剩余长度
extern uchar uart2_rx_len;                      // uart1已接收长度
extern uchar uart2_tx_buf[UART2_BUF_SIZE];      // uart1发送缓冲区
extern uchar uart2_rx_buf[UART2_BUF_SIZE];      // uart1接收缓冲区
extern ushort uart2_timestamp;                  // 最后接收时间
extern uchar * uart2_tx_ptr;                    // 发送指针
extern uchar uart2_retry_times;                 // uart1重试次数
extern uchar uart2_result;                      // uart1通讯结果, 见UART1_RESULT_xxx
extern bit uart2_rx_pending;                    // uart1正在接收标志
extern bit uart2_tx_pending;                    // uart1正在发送标志
extern bit uart2_locked;                        // // uart1访问锁定

// 数据备份
extern uchar uart2_tx_len_bak;                 // uart1发送长度备份
extern uchar uart2_rx_len_bak;                 // uart1接收长度备份
extern uchar uart2_tx_buf_bak[UART2_BUF_SIZE]; // uart1发送缓冲区备份
extern uchar uart2_rx_buf_bak[UART2_BUF_SIZE]; // uart1接收缓冲区备份
extern uchar uart2_result_bak;                 // uart1通讯结果备份
// 通讯结果
#define UART2_RESULT_OK                         0
#define UART2_RESULT_TIMEOUT                    1
#define UART2_RESULT_CRC                        2
#define UART2_RESULT_EXCEPTION                  3
// UART2通讯最大重试次数
#define UART2_MAX_RETRY_TIMES       5

//#define UART2_START()               uart2_tx_ptr = uart2_tx_buf
//#define UART2_APPEND(type,val)     *((type *)uart2_tx_ptr++) = (val)
//#define UART2_END()                 uart2_tx_len //= uart2_tx_ptr - uart2_tx_buf

void UART2_START(void);
void UART2_APPEND1(uint8_t type,uint32_t val);
void UART2_APPEND2(uint8_t type,uint32_t val);
void UART2_END(void);

ushort from_little_endian_16(ushort n);//将多字节数转换为小端模式
ulong from_16_little_endian_32(ulong n);//将多字节数转换为小端模式
ulong from_little_endian_32(ulong n);//将多字节数转换为小端模式
void HAL_UART_RxCpltCallback(UART_HandleTypeDef huart);//接受处理函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef huart);//发送处理函数

HAL_StatusTypeDef USART0_Send_Date(uchar *data,uchar number);
bit Uart0_FrameEnded(void);//判断 uart0是否接收完成
bit Uart0_Send_Message(void);

void UART2_APPEND(uint8_t type,uint32_t val);
void Uart2_Begin_Write_Bit(uchar addr, ushort index,ushort count);
void Uart2_Begin_Write_Word(uchar addr, ushort index, ushort count);//拼接usart2发送内容
bit USART2_Send_Date(uchar *data,uchar number);
bit Uart2_Exchange_Message(void);// uart1发送
bit Uart2_Read_Event_Count(uchar addr);// 读取事件计数
bit Uart2_Read_RoBit(uchar addr, ushort index, ushort count);
bit Uart2_Read_RoWord(uchar addr, ushort index, ushort count);

void Modbus_Gateway(void);
void Modbus_Transparent(void);

#endif
